💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    10 Django Admin 커스터마이징 | ✅ 편저: 코담 운영자

    Django 웹 프로그래밍 강좌 10강 - Django Admin 커스터마이징 (Django 5.2 기준)

    강의 영상:

    이 강의는 Django 공식 문서의 2.2 튜토리얼 내용을 바탕으로 진행되며, Django 5.2 버전에 맞춰 Admin 화면을 커스터마이징하는 방법을 설명합니다.

    📚 공식문서 주소: https://docs.djangoproject.com/ko/5.2/ref/contrib/admin/


    1. Admin 기본 확장: ModelAdmin 클래스 활용

    기본 admin.site.register(Model) 방식은 단순 등록만 제공하며, 세부 커스터마이징이 불가능합니다. 보다 유연한 관리를 위해서는 ModelAdmin 클래스를 정의해야 합니다.

    예시:

    from django.contrib import admin
    from .models import Question, Choice
    
    class QuestionAdmin(admin.ModelAdmin):
        fields = ["pub_date", "question_text"]
    
    admin.site.register(Question, QuestionAdmin)
    
    • fields: 관리 화면에 보여질 필드 순서를 지정
    • QuestionAdmin 클래스를 admin.site.register()의 두 번째 인자로 넘겨 커스터마이징 적용

    불필요한 필드를 숨기거나, 순서를 바꾸는 데 유용하게 활용됩니다.


    2. 필드 그룹화: fieldsets 사용

    많은 필드를 입력받는 모델의 경우 시각적 그룹화를 통해 관리 편의성을 높일 수 있습니다.

    예시:

    class QuestionAdmin(admin.ModelAdmin):
        fieldsets = [
            ("질문 정보", {"fields": ["question_text"]}),
            ("날짜 정보", {"fields": ["pub_date"]}),
        ]
    
    • fieldsets는 튜플 리스트 형태이며, 각 그룹에는 제목과 필드 목록이 들어갑니다.
    • 제목을 생략하려면 None을 사용하면 됩니다.

    필드 그룹화를 통해 관리자 화면의 가독성을 높일 수 있습니다.


    3. Choice 인라인 등록 (StackedInline / TabularInline)

    질문(Question)을 생성하면서 바로 선택지(Choice)를 등록할 수 있도록 인라인 관리 기능을 추가할 수 있습니다.

    예시:

    class ChoiceInline(admin.TabularInline):
        model = Choice
        extra = 3  # 기본 제공되는 빈 폼 개수
    
    class QuestionAdmin(admin.ModelAdmin):
        fieldsets = [
            ("질문 정보", {"fields": ["question_text"]}),
            ("날짜 정보", {"fields": ["pub_date"]}),
        ]
        inlines = [ChoiceInline]
    
    • StackedInline: 필드들이 세로로 나열됨 (기본형)
    • TabularInline: 필드들이 테이블 형식으로 정렬됨 (실무에서 선호)

    extra는 새 객체 생성 시 제공될 폼의 개수를 지정합니다.


    4. 리스트 출력 커스터마이징 (list_display)

    Admin 목록 페이지에서 보이는 컬럼을 설정할 수 있습니다.

    예시:

    class QuestionAdmin(admin.ModelAdmin):
        list_display = ["question_text", "pub_date", "was_published_recently"]
    
    • list_display: 목록에 보여줄 필드 또는 메서드
    • was_published_recently: 모델 메서드도 사용 가능

    커스텀 필드 꾸미기

    @admin.display(ordering="pub_date", boolean=True, description="최근 발행")
    def was_published_recently(self):
        ...
    
    • @admin.display는 Django 3.2부터 도입된 데코레이터로, 정렬 기준, 불린 출력, 설명을 지정할 수 있습니다.

    커스텀 메서드를 admin 리스트에 자연스럽게 통합할 수 있습니다.


    5. 필터, 검색창 추가 (list_filter, search_fields)

    질문 목록에서 날짜나 텍스트를 기준으로 빠르게 필터링하거나 검색할 수 있습니다.

    예시:

    class QuestionAdmin(admin.ModelAdmin):
        list_display = ["question_text", "pub_date", "was_published_recently"]
        list_filter = ["pub_date"]
        search_fields = ["question_text"]
    
    • list_filter: 오른쪽 사이드바에 필터 옵션 생성
    • search_fields: 상단 검색창 생성 (부분 문자열 검색 지원)

    실제 관리자 페이지에서 자주 사용되는 기능이므로 필수 설정 요소입니다.


    6. Admin 템플릿 커스터마이징

    Django는 Admin 템플릿도 오버라이드할 수 있습니다. 예를 들어, 로고나 제목을 변경하고 싶을 때 사용합니다.

    커스터마이징 절차

    1. 프로젝트 루트에 templates/admin 디렉토리 생성
    2. Django 기본 admin 템플릿 위치에서 base_site.html 복사
    3. 수정 후 저장

    settings.py에 경로 등록

    TEMPLATES = [
        {
            ...
            "DIRS": [BASE_DIR / "templates"],
            ...
        }
    ]
    

    제목 변경 예시 (templates/admin/base_site.html)

    {% extends "admin/base.html" %}
    {% block title %}My Custom Admin{% endblock %}
    {% block branding %}<h1 id="site-name">My Custom Admin</h1>{% endblock %}
    

    Django 기본 admin은 admin/base.html과 그 자식 템플릿들로 구성되어 있으므로 원하는 위치만 선택적으로 덮어쓰면 됩니다.


    마무리 요약

    • ModelAdmin으로 등록/수정 화면 커스터마이징 가능
    • Inline 클래스로 외래키 모델도 함께 관리 가능
    • list_display, list_filter, search_fields는 관리자 효율성을 향상시킴
    • @admin.display로 메서드를 보기 좋게 출력 가능
    • 템플릿 커스터마이징으로 관리자 화면도 브랜드화 가능

    Django 튜토리얼 마무리

    이번 10강을 마지막으로 Django 공식 튜토리얼 기반 강의를 마칩니다. 지금까지 학습한 내용을 기반으로 자신만의 프로젝트를 실습하며 반복하고, 필요 시 공식 문서를 참조해보세요.

    반복 학습과 실습이 진짜 실력을 만들어 줍니다. 감사합니다.

    TOP
    preload preload